// @ts-nocheck
/**
 * 判断是否为空
 * @param val 数据
 */
export const validateNull = (val: any) => {
	if (typeof val === 'boolean') {
		return false;
	}
	if (typeof val === 'number') {
		return false;
	}
	if (val instanceof Array) {
		if (val.length === 0) return true;
	} else if (val instanceof Object) {
		if (JSON.stringify(val) === '{}') return true;
	} else {
		return val === 'null' || val == null || val === 'undefined' || val === undefined || val === '';
	}
	return false;
};

export const rule = {
	/**
	 * 校验用户输入的长度避免超长
	 *  0-255个字符
	 *  超长
	 */
	overLength(rule: any, value: any, callback: any) {
		if (value?.length > 255) {
			callback(new Error('输入内容过长，请重新输入'));
		} else {
			callback();
		}
	},
	/**
	 * 校验 请输入中文、英文、数字包括下划线
	 * 名称校验
	 */
	validatorNameCn(rule: any, value: any, callback: any) {
		const acount = /^[\u4E00-\u9FA5A-Za-z0-9_]+$/;
		if (value && !acount.test(value)) {
			callback(new Error('请输入中文、英文、数字包括下划线'));
		} else {
			callback();
		}
	},


	/**
	 * 校验 请输入英文、数字包括下划线
	 * 名称校验
	 */
	validatorNameLetterNumber(rule: any, value: any, callback: any) {
		const acount = /^[A-Za-z0-9_]+$/;
		if (value && !acount.test(value)) {
			callback(new Error('请输入中文、英文、数字包括下划线'));
		} else {
			callback();
		}
	},
	/**
	 * 校验 请输入大写英文、下划线
	 * 名称校验
	 */
	validatorCapital(rule: any, value: any, callback: any) {
		const acount = /^[A-Z_]+$/;
		if (value && !acount.test(value)) {
			callback(new Error('请输入大写英文、下划线'));
		} else {
			callback();
		}
	},

	/**
	 * 校验 请输入小写英文、下划线
	 * 名称校验
	 */
	validatorLowercase(rule: any, value: any, callback: any) {
		const acount = /^[a-z_]+$/;
		if (value && !acount.test(value)) {
			callback(new Error('请输入小写英文、下划线'));
		} else {
			callback();
		}
	},

	/**
	 * 校验 请输入小写英文
	 * 名称校验
	 */
	validatorLower(rule: any, value: any, callback: any) {
		const acount = /^[a-z]+$/;
		if (value && !acount.test(value)) {
			callback(new Error('请输入小写英文'));
		} else {
			callback();
		}
	},

	/**
	 * 校验首尾空白字符的正则表达式
	 *
	 */
	checkSpace(rule: any, value: any, callback: any) {
		const longrg = /[^\s]+$/;
		if (!longrg.test(value)) {
			callback(new Error('请输入非空格信息'));
		} else {
			callback();
		}
	},

	/**
	 * 校验手机号
	 */
	validatePhone(rule: any, value: any, callback: any) {
		const isPhone = /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/;

		if (value.indexOf('****') >= 0) {
			return callback();
		}

		if (!isPhone.test(value)) {
			callback(new Error('请输入合法手机号'));
		} else {
			callback();
		}
	},

	/**
	 * 校验手机号或者座机号
	 */
	 validatePhoneTel(rule: any, value: any, callback: any) {
		const isPhone = /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/;
		const isTel = /^(\d{3,4}-\d{7,8})|(\d{3,4}\d{7,8})$/
		if (!value) {
			callback();
		} else {
			if (!isPhone.test(value)&&!isTel.test(value)) {
				callback(new Error('请输入合法手机号或座机号'));
			} else {
				callback();
			}
		}
	},
		/**
	 * 校验手座机号
	 */
		 validateTel(rule: any, value: any, callback: any) {
			const isTel = /^(\d{3,4}-\d{7,8})|(\d{3,4}\d{7,8})$/
			if (!value) {
				callback();
			} else {
				if (!isTel.test(value)) {
					callback(new Error('请输入合法手机号或座机号'));
				} else {
					callback();
				}
			}
		},
	/**
	 * 身份证号
	 * @param rule
	 * @param value
	 * @param callback
	 */
	validateIDNumber(rule: any, value: any, callback: any) {
		const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;

		if (value && !reg.test(value)) {
			callback(new Error("请输入合法的身份证号"))
		} else {
			callback();
		}
	},

	/**
	 * 护照
	 * @param rule
	 * @param value
	 * @param callback
	 */
	validatePassPort(rule: any, value: any, callback: any) {
		const reg = /^[A-Z0-9]{6,14}$/;

		if (value && !reg.test(value)) {
			callback(new Error("请输入合法的护照号码"))
		} else {
			callback();
		}
	},

	/**
	 * 港澳居民来往内地通行证
	 * @param rule
	 * @param value
	 * @param callback
	 */
	validateHMPass(rule: any, value: any, callback: any) {
		const reg = /^[HMhm]\d{8}$/;

		if (value && !reg.test(value)) {
			callback(new Error("请输入合法的港澳居民来往内地通行证号码"))
		} else {
			callback();
		}
	},

	/**
	 * 台湾居民来往大陆通行证
	 * @param rule
	 * @param value
	 * @param callback
	 */
	validateTWPass(rule: any, value: any, callback: any) {
		const reg = /^([A-Z]{1,2}\d{8,10}|\d{8}|\d{10})$/;

		if (value && !reg.test(value)) {
			callback(new Error("请输入合法的台湾居民来往大陆通行证号码"))
		} else {
			callback();
		}
	},

	/**
	 * 统一社会信用代码
	 * @param rule
	 * @param value
	 * @param callback
	 */
	validateCreditCode(rule: any, value: any, callback: any) {
		const reg = /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/;

		if (value && !reg.test(value)) {
			callback(new Error("请输入合法的统一社会信用代码"))
		} else {
			callback();
		}
	},

	/* 正整数数字 */
	numberPositiveInteger(rule, value, callback) {
		validateFn('numberPositiveInteger', rule, value, callback, '包含非正整数字符');
	},

	/* 数字 */
	number(rule, value, callback) {
		validateFn('number', rule, value, callback, '包含非数字字符');
	},

	/* 字母 */
	letter(rule, value, callback) {
		validateFn('letter', rule, value, callback, '包含非字母字符');
	},

	/* 字母和数字 */
	letterAndNumber(rule, value, callback) {
		validateFn('letterAndNumber', rule, value, callback, '只能输入字母或数字');
	},

	/* 手机号码 */
	mobilePhone(rule, value, callback) {
		validateFn('mobilePhone', rule, value, callback, '手机号码格式有误');
	},

	/* 字母开头，仅可包含数字 */
	letterStartNumberIncluded(rule, value, callback) {
		validateFn('letterStartNumberIncluded', rule, value, callback, '必须以字母开头，可包含数字');
	},

	/* 禁止中文输入 */
	noChinese(rule, value, callback) {
		validateFn('noChinese', rule, value, callback, '不可输入中文字符');
	},

	/* 必须中文输入 */
	chinese(rule, value, callback) {
		validateFn('chinese', rule, value, callback, '只能输入中文字符');
	},

	/* 电子邮箱 */
	email(rule, value, callback) {
		validateFn('email', rule, value, callback, '邮箱格式有误');
	},

	/* URL网址 */
	url(rule, value, callback) {
		validateFn('url', rule, value, callback, 'URL格式有误');
	},

	/* 禁止字符输入 */
	character(rule, value, callback) {
		validateFn('character', rule, value, callback, '不可输入特殊字符');
	},
	hundred(rule, value, callback) {
		validateFn('hundred', rule, value, callback, '请输入1-100之间的整数');
	},
	/* json 格式 */
	json(rule, value, callback) {
		if (validateNull(value) || value.length <= 0) {
			callback();
			return;
		}

		try {
			JSON.parse(value);
			callback();
		} catch (error) {
			callback(new Error('json 格式有误'));
		}
	},

	regExp(rule, value, callback) {
		if (validateNull(value) || value.length <= 0) {
			callback();
			return;
		}

		const pattern = new RegExp(rule.regExp);

		if (!pattern.test(value)) {
			const errTxt = rule.errorMsg || 'invalid value';
			callback(new Error(errTxt));
		} else {
			callback();
		}
	},
};

/**
 * @desc  [自定义校验规则]
 * @example
 *  import { validateRule } from "@/utils/validateRules";
 *  rules: [
 *     { validator: validateRule.emailValue, trigger: 'blur'}
 *  ]
 */

export const getRegExp = function (validatorName) {
	const commonRegExp = {
		character: '^[a-zA-z0-9\u4e00-\u9fa5]+$',
		number: '^[-]?\\d+(\\.\\d+)?$',
		numberPositiveInteger: '^[1-9][0-9]*$',
		letter: '^[A-Za-z]+$',
		letterAndNumber: '^[A-Za-z0-9]+$',
		mobilePhone: '^[1][3-9][0-9]{9}$',
		letterStartNumberIncluded: '^[A-Za-z]+[A-Za-z\\d]*$',
		noChinese: '^[^\u4e00-\u9fa5]+$',
		chinese: '^[\u4e00-\u9fa5]+$',
		email: '^([-_A-Za-z0-9.]+)@([_A-Za-z0-9]+\\.)+[A-Za-z0-9]{2,3}$',
		url: '(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]',
		hundred: '^(100|[1-9]?\d)$'
	};
	return commonRegExp[validatorName];
};

const validateFn = (validatorName, rule, value, callback, defaultErrorMsg) => {
  if (validateNull(value) || value.length <= 0) {
    callback();
    return;
  }

  const reg = new RegExp(getRegExp(validatorName));
  if (!reg.test(value)) {
    const errTxt = rule.errorMsg || defaultErrorMsg;
    callback(new Error(errTxt));
  } else {
    callback();
  }
};

